"""
管道通讯(Pipe), 只能用于有亲缘关系进程中,比如父子进程
    1. 通讯原理
        在内存中开辟管道控件,生成管道操作对象,多个进程使用相同一个管道对象进行读写即可实现通讯
        
    2. 管道对象在父进程中创建,子进程通过父进程获取数据
    
    3. 实现方法
        from multiprocessing import Pipe

        df1,df2 = Pipe(duplex = True)
        功能: 创建管道
        参数: 默认表示双向管道, 如果为False 表示单向管道
        返回值: 表示管道两端的读写对象, 如果是双向管道均可读写, 如果是单向管道,fd1只读,fd2只写

        fd.recv()
        功能: 从管道获取内容
        返回值: 获取到的数据

        fd.send(data)
        功能: 向管道发送数据
        参数: 要写入的数据
"""
from multiprocessing import Process, Pipe

# 创建管道
fd1, fd2 = Pipe() # 默认双向管道

#%% 功能: 两个函数, 第二个函数需要获取函数1的授权
def fun1():
    print(f"启动App1, 请登录:")
    print(f"请求App2 授权")
    fd1.send("app1 请求登录")  # 写入管道
    data = fd1.recv()
    if data:
        print("准许登录!", data)
    else:
        print("登录失败!")
    

def fun2():
    data = fd2.recv()  # 当管道中没有函数时,会阻塞
    print()
    print(data)
    fd2.send(("zs", "123"))
    
# 管道通讯需要在process函数之前创建
ls = [fun1, fun2]
li = []
for i in ls:
    fd = Process(target=i) # 创建多线程
    fd.start()
    li.append(i)
    print(fd.name)
if li:
    for c in li:
        fd.join()
